"""
author：fc
date：  2021/10/5
"""
# 这是文本相似度计算的尝试1，gensim应该匹配的是字体相似度。
# 我先用两个一模一样的文本尝试一下是否相似度是100%

'''使用的库介绍
================
1.gensim是自然语言处理工具，包含多个模型，tf-idf只是其中一个
    1-1. corpora是语料库，models和similarities顾名思义
2.jiba啊用于做文章中关键词分割的，他可以用多种切割模式
3.collection中的defautdict用于存储关键词出现的频率
==================
'''

import jieba
from gensim import corpora,models,similarities
from collections import defaultdict
import random

def random_make_copy():
    '''
    随机构造比较副本
    :return:
    '''
    compared_doc = open(file_path + "/9-19-副本2.txt", encoding='utf-8').read()  # 副本1 文档比较是1
    dic_copy=jieba.cut(compared_doc)
    fh_w=open(file_path + "/9-19-副本2.txt",'w', encoding='utf-8')
    fh_w.write("")
    fh_w.close()
    a=[]
    for item in dic_copy:
        a.append(item)

    with open(file_path + "/9-19-副本2.txt",'a' ,encoding='utf-8') as fh:
        for j in range(len(a)):
            random_num=random.randint(0,len(a)-1)
            fh.write(a[random_num])

# 1读取文档
file_path="../files/txt/txt_similarity/test/"
doc1=open(file_path+"9-19.txt",encoding='utf-8').read() # 文档1
doc2=open(file_path+"9-15.txt",encoding='utf-8').read() # 文档2
# 2.文档分词
dic1=jieba.cut(doc1) # 将文档切分为多个关键词
dic2=jieba.cut(doc2)
# 3.文档格式整理
data1 = ''
data2 = ''
for item in dic1:
    data1 += item+' ' # 将每个关键词用空格隔开并组合为一个句子
print(f"-----------------------\ndata1：\n{data1}\n-----------------------")
for item in dic2:
    data2 += item + ' '  # 将每个关键词用空格隔开并组合为一个句子
print(f"-----------------------\ndata2：\n{data2}\n-----------------------")
documents = [data1,data2] # 这步是必须的，即使只有一个文档来比较，否则保存语料库会失败,单独一个文档比较相似度为0
words=[[word for word in document.split()] for document in documents] # 将关键词和标点作为数组存储
print(f"-----------------------\nwords：\n{words}\n--------------------------")

# 4.计算关键词频率
freq = defaultdict(int) # 这个对下面的字典保存有影响，有些奇怪，否则会报要求数组异常
for word in words:
    for token in word:
        freq[token] += 1
print(f"-----------------------\nfreq：\n{freq}\n--------------------------")

# 5.根据频率去掉关键词，
# new_words=[token for token in words if freq[token]>1]

# 6.建立词典并保存词典和得到特征数
dicts=corpora.Dictionary(words)
print(f"-----------------------\ndicts：\n{dicts}\n--------------------------")
dicts.save(file_path+"9-19.dict")

# 7.比较文档
random_make_copy()
compared_doc=open(file_path+"/9-19-副本2.txt",encoding='utf-8').read() # 副本1 文档比较是1
compared_dict=jieba.cut(compared_doc)
compared_data3=""
for i in compared_dict:
    compared_data3 += i + " "
print(f"-----------------------\n比较文档：\n{compared_data3}\n--------------------------")

# 8.构建稀疏向量并保存
spare_vec=dicts.doc2bow(compared_data3.split()) # 沟通源文档和比较文档之间的桥梁（doc2bow）
corpus=[dicts.doc2bow(text) for text in words]
corpora.MmCorpus.serialize(file_path+'diray.mm',corpus)

# 9.稀疏矩阵得到相似性
tfidf = models.TfidfModel(corpus)
feture_num=len(dicts.token2id.keys())
spare_matrix=similarities.SparseMatrixSimilarity(tfidf[corpus],num_features=feture_num)
sims=spare_matrix[tfidf[spare_vec]]
print(f"特征数：{feture_num}  相似性{sims}")